package com.itstyle.seckill.topic.jichu;

/**
 * @Auther: liuwenxiang
 * @Date: 2020/3/12 16:37
 * @Description:
 * 内部类的作用：
 * 1,代码封装性
 * 一个类的某些独有特性，抽象为一个对象，就可以为这个类设置一个内部类
 * 2.实现多继承
 * 类只能单继承，可以在外部类和内部类都实现继承
 * 3.用匿名内部类实现回调功能
 *  调用某个方法，在方法中调用匿名内部类的方法，这样就实现回调了
 * 4.解决继承及实现接口出现同名方法的问题
 * 一个接口有aa()方法， 一个类也有aa()方法，当类实现接口，这两个方法不能共存，只能重栽
 * 但是通过内部类和外部类可以有同名的方法。
 *
 */
public class InnClass {

    public int pubVal=1;

    private int priVal=2;

    private static   int staVal=3;

    public static void staticMethod(){}

    public void publicMethod() {
        class InnnerClass{
            int a=100;
        }
        InnnerClass innnerClass =new InnnerClass();
        System.out.println("局部内部类："+innnerClass.a);
    }

    private void privateMethod() {
        int x = new InnClass(){
            public int newVal = 20;
            @Override
            public void publicMethod() {
                super.publicMethod();
            }

        }.newVal;
        System.out.println("匿名内部类："+x);
    }


    /**
     * 不能使用static来修饰任何成员内部类中的属性和方法，但可以使用private、final等其余任意修饰符
     * 可以用static final来修饰成员
     * 可以允许与外部类字段和方法重名
     * ==============================
     * "外部类"要访问"成员内部类"的属性和方法需要先new对象
     */
    //成员内部类 --理解为外部类的普通成员方法
    class InnnerClass{
        //static int pubVal =1; 错误写法
        //static int publicMethod(){}  错误写法
        static final int pubVal=4;
        public void print(){

            System.out.println(pubVal);
            System.out.println(InnClass.this.pubVal);
            System.out.println(InnClass.staVal);
            InnClass.staticMethod();

        }

    }

      static class InnnerClass1{
        static int m =1009;
        int a =3;
        static void m(){
            System.out.println(m);
            System.out.println(staVal);
            staticMethod();
        }
        void n(){
            System.out.println(a);
        }

    }



    public static void main(String[] args) {



        InnnerClass1.m();






        //成员内部类
        InnClass.InnnerClass innnerClass =new InnClass().new InnnerClass();
        innnerClass.print();

        //静态内部类
        InnClass.InnnerClass1 innnerClass1=new InnClass.InnnerClass1();
        innnerClass1.n();//非静态方法

        InnnerClass1.m();//静态方法


    }
}
